package mysql

import (
	"fmt"
    "go-iot/app/common/logger"
	"go-iot/app/common/config"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
    "gorm.io/driver/mysql"
    _ "github.com/go-sql-driver/mysql"
)

var DB *gorm.DB

type MysqlConfig struct {
	Username string
	Password string
	Addr string
	Port int
	Database string
	Prefix string
}

func (r MysqlConfig) String() string {
	return fmt.Sprintf("[addr=%s, port=%v, prefix=%s, database=%s, username=%s, password=%s]",
		r.Addr, r.Port, r.Prefix, r.Database, r.Username, r.Password)
}

var DefaultMysqlConfig MysqlConfig = MysqlConfig{
	Addr:     "127.0.0",
	Port: 3306,
    Username: "",
    Password: "",
    Database: "",
	Prefix: "",
}

func Config(opt *config.Options) {

    DefaultMysqlConfig.Addr = opt.Mysql.Addr
	DefaultMysqlConfig.Port = opt.Mysql.Port
	DefaultMysqlConfig.Username = opt.Mysql.Username
    DefaultMysqlConfig.Password = opt.Mysql.Password
    DefaultMysqlConfig.Database = opt.Mysql.Database
    DefaultMysqlConfig.Prefix = opt.Mysql.Prefix

    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
    DefaultMysqlConfig.Username,
    DefaultMysqlConfig.Password, 
    DefaultMysqlConfig.Addr, 
    DefaultMysqlConfig.Port, 
    DefaultMysqlConfig.Database)
    
    // 配置GORM
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        SkipDefaultTransaction: true, // 禁用默认事务
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:  DefaultMysqlConfig.Prefix, // 表名前缀
			SingularTable: true,    // 使用单一表名, eg. `User` => `user`
		},
		DisableForeignKeyConstraintWhenMigrating: true,   // 禁用自动创建外键约束
    })

    if err != nil {
        logger.Errorf("数据库连接失败: %v", err)
        return
    }

    // 获取底层的 *sql.DB 对象来设置连接池
    sqlDB, err := db.DB()
    if err != nil {
        logger.Errorf("获取数据库实例失败: %v", err)
        return
    }

    logger.Infof("mysql config: %v", DefaultMysqlConfig)

    // 设置连接池参数
    sqlDB.SetMaxOpenConns(100) // 最大打开连接数
    sqlDB.SetMaxIdleConns(10)  // 最大空闲连接数
    DB = db
}